<?php
namespace Pinenut\Model\ReferenceContainer;
/**
 * Контейнер для одной связи (один-к-многим, один-к-одному)
 * 
 * В нем реализуются методы установки связи, получения обратной связи
 * 
 * 
 * @author Kosh
 *
 */
use Pinenut\Model\ReferenceContainer;

class One extends ReferenceContainer {
	

	public function populate(array $data = array(), $fromStore = false) {

		$this->_reference->setParent($this);
		$this->_reference->setField($this->_field);
			
		if (!empty($data)) {	
			$field = clone $this->_reference;
			$field->populate($data, $fromStore);
			$this->_container = $field;
		}
		
		return $this;
	}
	
	public function toArray($forStore = false) {
		if (isset($this->_container))
			return $this->_container->toArray($forStore);
	}
	
	
	/**
	 * Трогаем связь, если её не было, создаётся пустышка
	 *
	 * @param string $id
	 * @param array $params
	 * @return \Pinenut\Model\Reference
	 */
	protected function touchReference($id, array $params = array()) {
		
		// прямая связь
		$reference = clone $this->_reference;
		
		if (count($params)) 
			$reference->populate($params);
			
		$reference->_ref = (string) $id;

		
		$refData = $reference->toArray(true);
		
		// вносим изменения в базу, если они требуются
		$this->modify()
			->whereNot('_ref', $refData['_ref'])
			->set(null, $refData)
			->execute();

		return $reference;
	}
	
	
	public function getReference($id = null) {
		

		
		if (null !== $this->_container) {
			if (null !== $id && (string)$this->_container->_ref !== (string)$id) {
				return null;
			} else {
				return $this->_container;
			} 
		}
		
		$model = $this->getModel();
		$raw = $model->find()
			  ->where('_id', $model->_id)
//			  ->where($this->_field.'._ref', $model::typeCast($id, static::ID))
			  ->active(false)
			  ->fields(array($this->_field))
			  ->one();
		
		if ($raw) {
			if (null !== ($data = static::_getFromMultiArrayByPath($raw, $this->_field))) {
				$reference = clone $this->_reference;
				$reference->populate($data, true);
				$this->_container = $reference;
				return $reference;
			}
		}
		
	}
}